package hero.mps.web.sys_menu.utils;

import hero.mps.web.sys_menu.entity.RouterVO;
import hero.mps.web.sys_menu.entity.SysMenu;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class MakeTree {
    public static List<SysMenu> makeMenuTree(List<SysMenu> menuList, Integer parentId) {
        // 定义返回的List
        List<SysMenu> list = new ArrayList<SysMenu>();
        Optional.ofNullable(menuList).orElse(new ArrayList<>())
                .stream()
                .filter(item -> item != null && parentId.equals(item.getParentId()))
                .forEach(dom -> {
                    SysMenu sysMenu = new SysMenu();
                    BeanUtils.copyProperties(dom, sysMenu);
                    // 获取下级
                    List<SysMenu> menuTree = makeMenuTree(menuList, dom.getMenuId());
                    sysMenu.setChildren(menuTree);
                    list.add(sysMenu);
                });
        return list;
    }

    /**
     * 生成路由
     * @param menuList
     * @param pid
     * @return
     */
    public static List<RouterVO> makeRoute(List<SysMenu> menuList, Integer pid) {
        // 接受产生的路由数据
        List<RouterVO> list = new ArrayList<>();

        // 组装数据
        Optional.ofNullable(menuList).orElse(new ArrayList<>())
                .stream()
                .filter(item -> item != null && pid.equals(item.getParentId()))
                .forEach(item -> {
                    RouterVO routerVO = new RouterVO();
                    routerVO.setName(item.getName());
                    routerVO.setPath(item.getPath());

                    // 判断是否是一级菜单
                    if (item.getParentId().equals(0)) {
                        routerVO.setComponent("Layout");
                        routerVO.setAlwaysShow(true);
                    } else {
                        routerVO.setComponent(item.getUrl());
                        routerVO.setAlwaysShow(false);
                    }

                    // 设置meta
                    routerVO.setMeta(routerVO.new Meta(
                            item.getTitle(),
                            item.getIcon(),
                            item.getCode().split(",")
                    ));

                    // 设置children
                    List<RouterVO> children = makeRoute(menuList, item.getMenuId());
                    // 过滤掉没有 path 的子路由
                    children = children.stream()
                            .filter(child -> child.getPath() != null && !child.getPath().isEmpty())
                            .collect(Collectors.toList());
                    routerVO.setChildren(children);

                    // 如果children数组为空，删除children属性
                    if (routerVO.getChildren().isEmpty()) {
                        routerVO.setChildren(null);
                    } else {
                        routerVO.setAlwaysShow(true);
                    }

                    // 只有当 path 存在且不为空时才添加到列表
                    if (routerVO.getPath() != null && !routerVO.getPath().isEmpty()) {
                        list.add(routerVO);
                    }
                });

        return list;
    }
}
